from typing import Optional, Tuple, List

from common.basic_mongo import get_container_mark_config_collection, get_container_status_collection
from common.container_operate.dict_model import ContainerConfig, ContainerStatus, ProductInfo


async def check_container_mark(mark: str) -> Tuple[Optional[ContainerConfig], str]:
    """校验容器码, 返回解析出的容器码数据库配置以及错误信息"""
    # 获取当前的容器码配置
    config_db = get_container_mark_config_collection()

    async for config in config_db.find({}):
        if mark.startswith(config['prefix']):
            # 解析剩余的流水号
            num_str = mark[len(config['prefix']):]
            if len(num_str) != config['serial_len']:
                return None, '容器码值流水号错误'
            try:
                num = int(num_str)
                if not (config['start'] <= num <= config['end']):
                    return None, '容器码值流水号错误'
                else:
                    return config, ''
            except Exception:
                return None, '容器码值流水号错误'

    return None, '配置为空, 请先导入码值规则'


async def get_container_by_mark(container_mark: str) -> Optional[ContainerStatus]:
    """根据容器码查询容器状态记录, 如果返回为None表示容器码未使用"""
    container_db = get_container_status_collection()
    query = {'container_mark': container_mark}
    container = await container_db.find_one(query)
    return container


async def container_check(container_mark: str) -> Tuple[bool, str]:
    """检查载具是否可用
    :param container_mark: 载具编号
    :return 第一个返回值为True, 表示可以使用, 否则第二个返回值返回错误信息
    """
    config, err = await check_container_mark(container_mark)
    if err:
        return False, err

    container = await get_container_by_mark(container_mark)

    if container and container['count'] > 0:
        return False, f'容器{container_mark}非空, 正在使用中'

    return True, ''


async def get_product_list_by_container_mark(container_mark: str) -> List[ProductInfo]:
    """获取容器内的单件码信息"""
    container = await get_container_by_mark(container_mark)
    if not container:
        return []
    return container["product_list"]
